perm filename ALLOC.PAS[AL,HE]1 blob
sn#663250 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 (*$E+ routines to allocate & release the various data blocks used by AL programs *)
C00004 00003 (* Global variables to keep track of things *)
C00005 00004 (* initAlloc & showAlloc *)
C00007 00005 (* Internal routines to fool the compiler *)
C00011 00006 (* External routines to allocate & free up nodes *)
C00016 ENDMK
C⊗;
(*$E+ routines to allocate & release the various data blocks used by AL programs *)
program alloc;
type
u = (used,free);
vectorp = ↑vector;
vector = record case u of
used: (refcnt: integer; val: array [1..3] of real);
free: (next: vectorp);
end;
transp = ↑trans;
trans = record case u of
used: (refcnt: integer; val: array [1..3,1..4] of real);
free: (next: transp);
end;
nodep = ↑node;
node = record next: nodep; filler: array [1..6] of integer; end; (* 1..5 *)
(* the following get used for misc record types - i.e. we fake out Pascal's type
checking mechanism *)
s4p = ↑s4;
s4 = record next: s4p; filler: array [1..3] of integer; end;
s8p = ↑s8;
s8 = record next: s8p; filler: array [1..7] of integer; end;
s11p = ↑s11;
s11 = record next: s11p; filler: array [1..10] of integer; end;
statementp = ↑statement;
statement = packed record
next, last, stlab, exprs: statementp;
nlines: integer;
bpt: boolean;
filler: array [1..5] of integer;
end;
(* Global variables to keep track of things *)
var freeVectors: vectorp;
freeTrans: transp;
freeNodes: nodep;
free4: s4p;
free8: s8p;
free10: statementp;
free11: s11p;
cv,ct,cn,c4,c8,c10,c11: integer; (* max number of records allocated *)
ccv,cct,ccn,cc4,cc8,cc10,cc11: integer; (* current # in use *)
(* initAlloc & showAlloc *)
procedure initAlloc;
begin
freeVectors := nil;
freeTrans := nil;
freeNodes := nil;
free4 := nil;
free8 := nil;
free10 := nil;
free11 := nil;
cv := 0; ccv := 0;
ct := 0; cct := 0;
cn := 0; ccn := 0;
c4 := 0; cc4 := 0;
c8 := 0; cc8 := 0;
c10 := 0; cc10 := 0;
c11 := 0; cc11 := 0;
end;
procedure showAlloc;
begin
writeln('size current # in use / # allocated');
writeln;
writeln('vector ',ccv,'/',cv);
writeln('trans ',cct,'/',ct);
writeln('node ',ccn,'/',cn);
writeln('s4 ',cc4,'/',c4);
writeln('s8 ',cc8,'/',c8);
writeln('s10 ',cc10,'/',c10);
writeln('s11 ',cc11,'/',c11);
writeln;
writeln;
end;
(* Internal routines to fool the compiler *)
function new4: s4p;
var n: s4p;
begin
cc4 := cc4 + 1;
n := free4;
if n = nil then
begin
new(n);
c4 := c4 + 1;
end
else free4 := n↑.next;
new4 := n;
end;
procedure rel4(n: s4p);
begin
cc4 := cc4 - 1;
n↑.next := free4;
free4 := n;
end;
function new8: s8p;
var n: s8p;
begin
cc8 := cc8 + 1;
n := free8;
if n = nil then
begin
new(n);
c8 := c8 + 1;
end
else free8 := n↑.next;
new8 := n;
end;
procedure rel8(n: s8p);
begin
cc8 := cc8 - 1;
n↑.next := free8;
free8 := n;
end;
function new10: statementp;
var n: statementp;
begin
cc10 := cc10 + 1;
n := free10;
if n = nil then
begin
new(n);
c10 := c10 + 1;
end
else free10 := n↑.next;
new10 := n;
end;
procedure rel10(n: statementp);
begin
cc10 := cc10 - 1;
n↑.next := free10;
free10 := n;
end;
function new11: s11p;
var n: s11p;
begin
cc11 := cc11 + 1;
n := free11;
if n = nil then
begin
new(n);
c11 := c11 + 1;
end
else free11 := n↑.next;
new11 := n;
end;
procedure rel11(n: s11p);
begin
cc11 := cc11 - 1;
n↑.next := free11;
free11 := n;
end;
(* External routines to allocate & free up nodes *)
function newVector: vectorp;
var v: vectorp;
begin
ccv := ccv + 1;
v := freeVectors;
if v = nil then
begin
new(v);
cv := cv + 1;
end
else freeVectors := v↑.next;
v↑.refcnt := 0;
newVector := v;
end;
procedure relVector(v: vectorp);
begin
ccv := ccv - 1;
v↑.next := freeVectors;
freeVectors := v;
end;
function newTrans: transp;
var t: transp;
begin
cct := cct + 1;
t := freeTrans;
if t = nil then
begin
new(t);
ct := ct + 1;
end
else freeTrans := t↑.next;
t↑.refcnt := 0;
newTrans := t;
end;
procedure relTrans(t: transp);
begin
cct := cct - 1;
t↑.next := freeTrans;
freeTrans := t;
end;
function newNode: nodep;
var n: nodep;
begin
ccn := ccn + 1;
n := freeNodes;
if n = nil then
begin
new(n);
cn := cn + 1;
end
else freeNodes := n↑.next;
n↑.next := nil;
newNode := n;
end;
procedure relNode(n: nodep);
begin
ccn := ccn - 1;
n↑.next := freeNodes;
freeNodes := n;
end;
function newEvent: s4p; begin newEvent := new4; end;
procedure relEvent(n: s4p); begin rel4(n); end;
function newEentry: s4p; begin newEentry := new4; end;
procedure relEentry(n: s4p); begin rel4(n); end;
function newToken: s4p; begin newToken := new4; end;
procedure relToken(n: s4p); begin rel4(n); end;
function newIdent: s4p; begin newIdent := new4; end;
procedure relIdent(n: s4p); begin rel4(n); end;
function newStrng: nodep; begin newStrng := newnode; end;
procedure relStrng(n: nodep); begin relnode(n); end;
function newCmoncb: nodep; begin newCmoncb := newnode; end;
procedure relCmoncb(n: nodep); begin relnode(n); end;
function newVaridef: s8p; begin newVaridef := new8; end;
procedure relVaridef(n: s8p); begin rel8(n); end;
function newFrame: s8p; begin newFrame := new8; end;
procedure relFrame(n: s8p); begin rel8(n); end;
function newEheader: s8p; begin newEheader := new8; end;
procedure relEheader(n: s8p); begin rel8(n); end;
function newStatement: statementp;
var s: statementp;
begin
s := new10;
with s↑ do
begin next := nil; last := nil; stlab := nil; exprs := nil; bpt := false;
nlines := 1; end;
newStatement := s;
end;
procedure relStatement(n: statementp); begin rel10(n); end;
function newPdb: s8p; begin newPdb := new8; end;
procedure relPdb(n: s8p); begin rel8(n); end;
function newEnvironment: s11p; begin newEnvironment := new11; end;
procedure relEnvironment(n: s11p); begin rel11(n); end;
begin
end.